From 5a16f92aee6d10894ce7a1d7d9888323f036fde8 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Wed, 18 Feb 2009 08:59:26 +0000 Subject: [PATCH] x86: Fix xen panic when offlining a CPU. Also, fix a typo in a message. 'irq' => 'vector' Signed-off-by: Kouya Shimura --- xen/arch/x86/irq.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/xen/arch/x86/irq.c b/xen/arch/x86/irq.c index 6c5b6ad395..a0829a05ba 100644 --- a/xen/arch/x86/irq.c +++ b/xen/arch/x86/irq.c @@ -1142,6 +1142,8 @@ void fixup_irqs(cpumask_t map) static int warned; irq_guest_action_t *action; struct pending_eoi *peoi; + irq_desc_t *desc; + unsigned long flags; /* Direct all future interrupts away from this CPU. */ for ( vector = 0; vector < NR_VECTORS; vector++ ) @@ -1150,18 +1152,24 @@ void fixup_irqs(cpumask_t map) if ( vector_to_irq(vector) == 2 ) continue; - cpus_and(mask, irq_desc[vector].affinity, map); + desc = &irq_desc[vector]; + + spin_lock_irqsave(&desc->lock, flags); + + cpus_and(mask, desc->affinity, map); if ( any_online_cpu(mask) == NR_CPUS ) { printk("Breaking affinity for vector %u (irq %i)\n", vector, vector_to_irq(vector)); mask = map; } - if ( irq_desc[vector].handler->set_affinity ) - irq_desc[vector].handler->set_affinity(vector, mask); - else if ( irq_desc[vector].action && !(warned++) ) - printk("Cannot set affinity for irq %u (irq %i)\n", + if ( desc->handler->set_affinity ) + desc->handler->set_affinity(vector, mask); + else if ( desc->action && !(warned++) ) + printk("Cannot set affinity for vector %u (irq %i)\n", vector, vector_to_irq(vector)); + + spin_unlock_irqrestore(&desc->lock, flags); } /* Service any interrupts that beat us in the re-direction race. */ -- 2.30.2